import java.io.IOException;

import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;

/**
 * KEYIN：为mapper阶段输出的key类型 VALUEIN：为mapper阶段输出的value类型
 * KEYOUT：为reduce阶段输出的KV对的key类型 VALUEOUT：为reduce阶段输出的KV对的value类型
 * 
 * @author knight
 *
 */
public class WordCountReducer extends Reducer<Text, IntWritable, Text, IntWritable> {

	/**
	 * reduce 方法是提供给reduce task进程来调用的 reduce
	 * task会将shuffle阶段过来的大量数据K,V对进行聚合，相同K的KV会聚合为一组 reduce
	 * task会对每一组聚合KV调用一次我们自定义的reduce方法
	 * 比如<hello,1><hello,1><hello,1><hello,1><tom,1><tom,1> hello这一组会调用一次，tom组会调用一次
	 * 调用时传递的参数： key：一组KV中的key（都一样就传一次） values：一组KV中的所有value的一个迭代器
	 */
	@Override
	protected void reduce(Text key, Iterable<IntWritable> values,
			Reducer<Text, IntWritable, Text, IntWritable>.Context context) throws IOException, InterruptedException {
		//
		int count = 0;

		for (IntWritable value : values) {
			count += value.get();
		}
		context.write(key, new IntWritable(count));

	}

}
